using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using SIOGDE.AccesoDatos.Entidades;
using SIOGDE.AccesoDatos.Contratos;
using SIOGDE.Negocios.Servicios;
using SIOGDE.Negocios.Excepciones;
using SIOGDE.AccesoDatos.Entidades.Reportes;

namespace SIOGDE.Negocios
{
   /// <summary>
   /// Implementacion de la interface IDestinoAsignadoNegociosServicio, los metodos que estan definidos en el contrato IDestinoAsignadoNegociosServicio serán accesibles desde un contexto externo
   /// </summary>	
   public class DestinoAsignadoNegocios : IDestinoAsignadoNegociosServicio
   {
	private IDestinoAsignadoAccesoDatos accesoDatos;
	public DestinoAsignadoNegocios()
	{		
		accesoDatos = DataFactory.Current.GetDestinoAsignadoAccesoDatos();
	}
	
	/// <summary>
    /// Devuelve una lista de DestinoAsignado's de las ocurrencias encontradas a partir del filtro
    /// </summary>    
	public List<DestinoAsignado> BuscarPorFiltro(string filtro)
	{
        return accesoDatos.BuscarPorFiltro(filtro, SIOGDE.Negocios.Global.Session.GestionActiva.Id).ToList();
		//return accesoDatos.BuscarPorFiltro(filtro).ToList();
	}

	#region operaciones básicas
	
	/// <summary>
    /// Elimina la entidad DestinoAsignado, lanzará una excepcion si la entidad guarda dependencia a otras entidades
    /// </summary>	
	public void Eliminar(DestinoAsignado entidad)
	{
		try
		{
		    accesoDatos.Delete(accesoDatos.GetById(entidad.Id));
	    }
		catch(Exception ex)
		{
		   throw new DestinoAsignadoEliminarExcepcion("DestinoAsignado");
		}
	}
	
	/// <summary>
    /// Devuelve DestinoAsignado, buscada por su Id, si no existe, entonces devuelve null
    /// </summary>	
	public DestinoAsignado ObtenerPorId(object Id)
	{
		return accesoDatos.GetById(Id);
	}

	/// <summary>
    /// Devuelve List<DestinoAsignado>, de todas la entidades de ese tipo
    /// </summary>	
	public List<DestinoAsignado> ObtenerTodas()
	{
		return accesoDatos.GetAll().ToList();
	}

	
	/// <summary>
    /// Guarda DestinoAsignado, previa ejecucion satisfactoria de las reglas de negocio
    /// </summary>	
	public DestinoAsignado Guardar(DestinoAsignado entidad)
	{
		//Agregar aqui las reglas de negocio.......	
		if(entidad==null)
		 throw new DestinoAsignadoRequeridoExcepcion();


		#region Foreign Keys Values
                
        if(entidad.GestionId_FK > 0 && entidad.Gestion==null)
            entidad.Gestion = DataFactory.Current.GetGestionAccesoDatos().GetById(entidad.GestionId_FK);
        else
            entidad.Gestion = SIOGDE.Negocios.Global.Session.GestionActiva;


        if(entidad.PersonaId_FK > 0 && entidad.Persona==null)
            entidad.Persona = DataFactory.Current.GetPersonaAccesoDatos().GetById(entidad.PersonaId_FK);
               
        if (entidad.RequerimientoConfigId_FK> 0 && entidad.RequerimientoConfig == null)
            entidad.RequerimientoConfig = DataFactory.Current.GetRequerimientoConfigAccesoDatos().GetById(entidad.RequerimientoConfigId_FK);
        #endregion

        DestinoAsignado destino = accesoDatos.GetPorPersonaId(entidad.PersonaId_FK, entidad.GestionId_FK);
        if (destino != null)
            throw new DestinoNoPuedeSerDuplicadoExcepcion();


        if (string.IsNullOrEmpty(entidad.Guid))
            entidad.Guid = System.Guid.NewGuid().ToString();
                
        entidad.FechaRegistro = DateTime.Now;
        entidad.RegistradoPor = SIOGDE.Negocios.Global.Session.UserInfo.Nombre;

		if (entidad.Id == 0)
			accesoDatos.Insert(entidad);
		else
			accesoDatos.Update(entidad);

		return entidad;
	}

       /// <summary>
       /// guarda de acuerdo al usuario que ha iniciado sesion
       /// </summary>
       /// <param name="guidRequerimiento"></param>
    public DestinoAsignado GuardarDestinoElegido(string guidRequerimiento)
    {
        RequerimientoConfig requerimiento = DataFactory.Current.GetRequerimientoConfigAccesoDatos().GetPorGuid(guidRequerimiento);

        DestinoAsignado destino = new DestinoAsignado();
        destino.Persona = SIOGDE.Negocios.Global.Session.UserInfo.Persona;
        destino.Observaciones = "Asignado por el sistema a eleccion del usuario";
        destino.RequerimientoConfig = requerimiento;
        destino.FechaAsignacion = DateTime.Now;
        destino.Gestion = SIOGDE.Negocios.Global.Session.GestionActiva;

        return Guardar(destino);


    }


    public DestinoAsignado GetDestinoActual()
    {
        return GetDestinoActual(SIOGDE.Negocios.Global.Session.GestionActiva.Id, SIOGDE.Negocios.Global.Session.UserInfo.Persona.Id);
    }

    public DestinoAsignado GetDestinoActual(int gestionId, int personaId)
    {
        return accesoDatos.GetPorPersonaId(personaId, gestionId);
    }


    public DestinoAsignado ObtenerPorGuid(string guidAsignacion)
    {
        return accesoDatos.GetPorguid(guidAsignacion);
    }

    public List<DestinoAsignado> GetPorPersonaId(int PersonaId)
    {
        return accesoDatos.GetPorPersonaId(PersonaId).ToList();
    
    }

    public List<DestinoAsignado> GetPorGestionActiva()
    {
        return accesoDatos.GetPorGestion(SIOGDE.Negocios.Global.Session.GestionActiva.Id).ToList();
    }

    public int CountPorGestionActiva()
    {
        return accesoDatos.CountPorGestionActiva(SIOGDE.Negocios.Global.Session.GestionActiva.Id); 
    }

	#endregion


    #region Reportes

    public List<DTODestinoAsignado> GetReporteDestinosPorGestionActiva()
    {
        return accesoDatos.GetReportePorGestion(Global.Session.GestionActiva.Id).ToList();
    }

    #endregion
       
   
   }
}


